package com.ms.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @description: jdk的动态代理
 * @author: ms
 * @create: 2022-08-29 14:29
 */
public class CalculateJdkProxy {

    private Object target;

    public CalculateJdkProxy(Object target) {
        this.target = target;
    }

    public Object getProxyObject(){

        /**
         * newProxyInstance()：创建一个代理实例
         * 其中有三个参数：
         * 1、classLoader：加载动态生成的代理类的类加载器
         * 2、interfaces：目标对象实现的所有接口的class对象所组成的数组
         * 3、invocationHandler：设置代理对象实现目标对象方法的过程，即代理类中如何重写接口中的抽象方法
         */
        ClassLoader loader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler invocationHandler = new InvocationHandler() {
            /**  proxy：代理对象
             *   method：代理对象需要实现的方法，即其中需要重写的方法
             *   args：method所对应方法的参数 */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("目标方法执行前执行，[方法名为: "+ method.getName() +"] ; [参数为: " + Arrays.toString(args)+"]");
                Object result = method.invoke(target, args);
                System.out.println("目标方法执行后执行，执行后的结果为: " + result.toString());
                return result;
            }
        };
        return Proxy.newProxyInstance(loader,interfaces, invocationHandler);
    }

}